package main

import (
	"fmt"
	"net"
	"os"
)

//网络文件传输接收端

func main() {

	//设置监听
	listen, err := net.Listen("tcp", "localhost:9999")
	if err != nil {
		fmt.Println("设置监听失败")
		return
	}
	defer listen.Close()
	//监听
	conn, err := listen.Accept()
	if err != nil {
		fmt.Println("监听失败")
		return
	}
	defer conn.Close()

	//接受文件名
	buf := make([]byte, 1024)
	fmt.Println("接受文件名")
	fmt.Println(string(buf))
	n, err := conn.Read(buf)
	if err != nil {
		fmt.Println("读取文件名失败")
		return
	}

	_, err = conn.Write([]byte("ok"))
	if err != nil {
		fmt.Println("返回ok失败")
		return
	}

	//创建文件
	file, err := os.Create(string(buf[:n]))
	if err != nil {
		fmt.Println("创建文件失败")
		return
	}
	defer file.Close()
	reciveFile(file, conn)
}

func reciveFile(file *os.File, conn net.Conn) {
	buf := make([]byte, 4*1024)
	for {

		n, err := conn.Read(buf)
		if err != nil {
			fmt.Println("conn.Read err:", err)
			return
		}
		if n == 0 {
			fmt.Println("文件读完了")
		}
		//接受收据并写入
		file.Write(buf[:n])
	}
}
